package com.jzo2o.trade.service.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.jzo2o.api.trade.dto.request.PayReqDTO;
import com.jzo2o.api.trade.dto.response.PayResDTO;
import com.jzo2o.api.trade.enums.PayChannelEnum;
import com.jzo2o.trade.Strategy.PayStrategy;
import com.jzo2o.trade.enums.TradingStateEnum;
import com.jzo2o.trade.model.domain.Trading;
import com.jzo2o.trade.service.IAliPayService;
import com.jzo2o.trade.service.IPayService;
import com.jzo2o.trade.service.ITradingService;
import com.jzo2o.trade.service.IWxPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * \* User: chy
 * \* Date: 2025/10/8  10:43
 * \* Description:
 * \
 */
@Service
@Slf4j
public class PayServiceImpl implements IPayService {

    @Resource
    private ITradingService tradingService;
    @Resource
    private IWxPayService wxPayService;
    @Resource
    private IAliPayService aliPayService;

    @Resource
    private Map<String, PayStrategy> payStrategyMap;  // todo:两种方式获取支付服务

//    private Map<String, PayStrategy> payStrategyMap2 = new HashMap<>();

//    @PostConstruct
//    public void init(){
//       log.info("初始化支付服务");
//        Map<String, PayStrategy> beansOfType = SpringUtil.getBeansOfType(PayStrategy.class);
//        beansOfType.forEach((k,v)->{
//            Integer payType = v.getPayType();
//        });
//    }

    /**
     * 统一支付服务
     *
     * @param reqDTO
     * @return
     */
    @Override
    public PayResDTO payServe(PayReqDTO reqDTO) {
        // 1.存支付记录
      Trading trading =  tradingService.save(reqDTO);
      if(trading == null){
          log.error("保存支付记录失败");
          throw new RuntimeException("保存支付记录失败");
      }
      log.info("保存支付记录成功,trading:{}",trading);

        //2.调用第三方收款平台  判断支付类型
        PayResDTO resDTO = null; //todo:因为可能有多种支付渠道,所以定义到外面.
//        //微信支付方式
//        if(reqDTO.getTradingChannel().getCode().equals(PayChannelEnum.WECHAT_PAY.getCode())){
//            log.info("微信支付开始");
//            resDTO = wxPayService.pay(trading);
//        //支付宝支付方式
//        }else if (reqDTO.getTradingChannel().getCode().equals(PayChannelEnum.ALI_PAY.getCode())){
//            log.info("支付宝支付开始");
//            resDTO = aliPayService.pay(trading);
//        }

        // todo:策略模式
        // 拿到对应的支付服务策略
        PayStrategy payStrategy = payStrategyMap.get(reqDTO.getTradingChannel().getCode()+ "");
        resDTO = payStrategy.pay(trading);

        //3.更新支付记录表
        trading.setTradingState(TradingStateEnum.FKZ.getCode());//修改支付状态为付款中
        trading.setUpdateTime(LocalDateTime.now());
        tradingService.updateById(trading);

        return resDTO;
    }
}
